package com.qingyun.system.controller;

import com.alibaba.fastjson2.JSON;
import com.qingyun.system.model.vo.WebSocketVO;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
@ServerEndpoint("/api/v1/chat/{userId}/{companyId}")
public class ChatWebSocket {

    private static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();

    /**
     * 代表当前用户ID
     */
    private String userId;

    /**
     * 建立websocket连接后，被调用
     * @param session 表示某个客户端浏览器
     */
    //@OnOpen注解表示有浏览器链接过来的时候被调用
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId, @PathParam("companyId") Long companyId) {
        sessionMap.put(userId, session);
        this.userId = userId;
        WebSocketVO webSocketVO = new WebSocketVO();
        webSocketVO.setFromUserName(userId);
        webSocketVO.setToUserName("assistant");
        webSocketVO.setRole("assistant");
        webSocketVO.setContent("您好：" + userId + "，青云智能客服为您服务！");
        webSocketVO.setCompanyId(companyId);
        webSocketVO.setCreateTime(LocalDateTime.now());

        // 使用FastJSON2将对象序列化为JSON字符串
        String jsonResponse = JSON.toJSONString(webSocketVO);

        // 向客户端发送消息
        try {
            session.getAsyncRemote().sendText(jsonResponse);
        } catch (Exception e) {
            e.printStackTrace();
            // 处理异常，比如记录日志或发送错误信息给客户端
        }
    }



    /**
     * 服务端发生错误时，被调用
     * @param session
     * @param cause
     */
    @OnError
    public void onError(Session session, Throwable cause) {
        System.out.println("发生错误");
    }

    /**
     * 关闭websocket连接后，被调用
     */
    @OnClose
    public void onClose() {
        this.sessionMap.remove(userId);
        System.out.println("用户" + userId + "已退出，当前在线人数为：" + sessionMap.size());
    }



    /**
     * 收到客户端的消息
     * @param message 消息
     * @param session 会话
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        try {
            System.out.println("收到消息：" + message);
            WebSocketVO webSocketVO = JSON.parseObject(message, WebSocketVO.class);
            // 查找目标用户的会话
            Session targetSession = sessionMap.get(webSocketVO.getToUserName());

            if (targetSession != null) {
                // 这里是模拟机器回消息
//                webSocketVO.setRole("assistant");
                webSocketVO.setCreateTime(LocalDateTime.now());
                String jsonResponse = JSON.toJSONString(webSocketVO);
                targetSession.getAsyncRemote().sendText(jsonResponse);
                System.out.println("消息发送成功");
            } else {
                // 如果目标用户不在线，处理错误或反馈
                System.out.println("目标用户不在线");
            }

            // 向当前客户端发送消息
            for (Session s : sessionMap.values()) {
                if (s.equals(session)) {
                    System.out.println(webSocketVO);
                    webSocketVO.setToUserName(webSocketVO.getFromUserName());
                    webSocketVO.setFromUserName("assistant");
                    // 这里是模拟机器回消息
                    webSocketVO.setRole("assistant");
                    webSocketVO.setContent(webSocketVO.getContent()+" 的系统自动回复");
                    webSocketVO.setCreateTime(LocalDateTime.now());
                    String jsonResponse = JSON.toJSONString(webSocketVO);
                    s.getAsyncRemote().sendText(jsonResponse);
                }
//                s.getAsyncRemote().sendText(jsonResponse);
            }
        } catch (Exception e) {
            System.out.println("发生错误");
        }
    }

}
